package com.weai.util;

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
import java.util.HashMap;
import java.util.Map;

/**
 * 日期工具类
 */
public class DateUtils {

    /**
     * 获取当前和上周时间范围
     * 业务周期定义：从上周四到本周三，一个周期为7天
     *
     * 示例：
     * - 如果今天是周三（5月8日），当前周期为5月2日（上周四）到5月8日（本周三）
     * - 如果今天是周四（5月9日），当前周期为5月9日（本周四）到5月15日（下周三）
     * - 如果今天是周五（5月10日），当前周期为5月9日（本周四）到5月15日（下周三）
     *
     * @return 包含当前周期和上周期的日期范围，键为：
     *         - startOfWeek: 本周期开始日期（上周或本周的周四）
     *         - endOfWeek: 本周期结束日期（本周或下周的周三）
     *         - startOfLastWeek: 上周期开始日期（比当前周期早一周的周四）
     *         - endOfLastWeek: 上周期结束日期（比当前周期早一周的周三）
     */
    public static Map<String, LocalDate> getCurrentAndLastWeekDateRange() {
        Map<String, LocalDate> dateRange = new HashMap<>();

        LocalDate now = LocalDate.now();

        // 根据当前日期确定所处的周期
        // 如果当前日期是周四或之后（周四、周五、周六、周日、周一、周二、周三），则当前周期从本周四开始
        // 如果当前日期是周四之前（周一、周二、周三），则当前周期从上周四开始
        LocalDate currentPeriodStart;

        if (now.getDayOfWeek().getValue() >= DayOfWeek.THURSDAY.getValue()) {
            // 当前日期是周四或之后，周期从本周四开始
            currentPeriodStart = now.with(TemporalAdjusters.previousOrSame(DayOfWeek.THURSDAY));
        } else {
            // 当前日期是周四之前，周期从上周四开始
            currentPeriodStart = now.with(TemporalAdjusters.previous(DayOfWeek.THURSDAY));
        }

        // 当前周期的结束日期是开始日期后的第6天（即下一个周三）
        // 周期为：周四、周五、周六、周日、周一、周二、周三，共7天
        LocalDate currentPeriodEnd = currentPeriodStart.plusDays(6);

        // 上一周期的开始和结束日期分别比当前周期早7天
        LocalDate lastPeriodStart = currentPeriodStart.minusWeeks(1);
        LocalDate lastPeriodEnd = currentPeriodEnd.minusWeeks(1);

        // 设置返回值
        dateRange.put("startOfWeek", currentPeriodStart);
        dateRange.put("endOfWeek", currentPeriodEnd);
        dateRange.put("startOfLastWeek", lastPeriodStart);
        dateRange.put("endOfLastWeek", lastPeriodEnd);

        return dateRange;
    }
}